#!/usr/bin/env python
# coding: utf-8

# # 本周内容：Reshaping Data
# 
# ## -Pivot
# <img style="width:500px" src="pivot.jpg">
# <img style="width:500px" src="pivot-2.jpg">
# <img style="width:500px" src="pivot-3.jpg">
# 
# ## -melt
# <img style="width:500px" src="melt.jpg">
# 
# 
# ## -stack
# 
# 
# ## -unstack

# # 长宽表的变形

# In[1]:


import pandas as pd


# In[2]:


# 创建长表格
pd.DataFrame(
    {
        'Gender':['F','F','M','M'],
        'Height':[163, 160, 175, 180]
    }
)


# In[4]:


# 创建宽表格
pd.DataFrame({'Height: F':[163, 160],'Height: M':[175, 180]})


# ## 1. pivot

# In[24]:


df = pd.DataFrame(
    {
        'Class':[1,1,1,1,2,2],
        'Name':['San Zhang','San Zhang','San Zhang','San Zhang','Si Li','Si Li'],
        'Subject':['Chinese','Math','English','Chinese','Chinese','Math'],
        'Grade':[59,75,80,60,90,85]}
)


# In[25]:


df


# In[26]:


df.pivot(index='Name', columns='Subject', values='Grade')


# In[27]:


df.pivot_table(index='Name', columns='Subject', values='Grade',aggfunc="max")


# In[ ]:





# * 我想看每一个人（index）的学科（columns）成绩分布情况（值）
# * 我想看每一个学科（index）的同学们的（columns）成绩分布情况（值）

# In[13]:


df.pivot(index='Subject', columns='Name', values='Grade')


# In[1]:


import pandas as pd


# In[2]:


hurun_独角兽 = pd.read_html('https://www.hurun.net/zh-CN/Info/Detail?num=L9SQPH9FKJB1')[-3]
hurun_独角兽[0:1].values.tolist()[0]
df_hurun = hurun_独角兽[1:]
df_hurun.columns = hurun_独角兽[0:1].values.tolist()[0]
df_hurun['价值（亿元人民币）'] = df_hurun['价值（亿元人民币）'].astype('int64')
df_hurun


# In[35]:


df_hurun.to_excel('output.xlsx')


# * 我想看每一个国家（index）的行业（columns）的估值（values）

# In[23]:


df_hurun.query('国家 == "中国"')


# In[18]:


df_hurun.query('国家 == "中国"')['行业'].unique()


# In[19]:


df_hurun.query('国家 == "美国"')['行业'].unique()


# In[14]:


df_hurun.pivot(index="国家",columns="行业",values = "价值（亿元人民币）")


# In[3]:


df_hurun_pivot = df_hurun.pivot_table(index="国家",columns="行业",values = "价值（亿元人民币）",aggfunc="max")
df_hurun_pivot


# In[5]:


get_ipython().system('pip install pyecharts')


# In[9]:


Faker.choose()


# In[10]:


Faker.values()


# In[27]:


行业 = df_hurun_pivot.columns.tolist()
行业


# In[24]:


中国 = df_hurun_pivot.query('国家 == "中国"').values[0].tolist()
中国


# In[25]:


美国 = df_hurun_pivot.query('国家 == "美国"').values[0].tolist()
美国


# # Bar可视化展示

# In[29]:


from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker

c = (
    Bar()
    .add_xaxis(行业)
    .add_yaxis("中国", 中国, stack="stack1")
    .add_yaxis("美国", 美国, stack="stack1")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        datazoom_opts=opts.DataZoomOpts(),
        title_opts=opts.TitleOpts(title="Bar-胡润TOP独角兽中美对比"))
    
)
c.render_notebook()


# # Pie饼状图的可视化展示

# In[ ]:





# In[31]:


from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add("", [list(z) for z in zip(行业,中国)])
    .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
    .set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    .render("pie_set_color.html")
)


# In[34]:


df_hurun_pivot.index


# In[36]:


国家数据 = []
for i in df_hurun_pivot.index:
    国家数据.append(df_hurun_pivot.query('国家 == "{country}"'.format(country=i)).values[0].tolist())
国家数据


# # 批量化产出可视化

# In[37]:


len(df_hurun_pivot.index)


# In[39]:


import pyecharts.options as opts
from pyecharts.charts import Pie

for i in range(len(df_hurun_pivot.index)):
    x_data = 行业
    y_data = 国家数据[i]
    data_pair = [list(z) for z in zip(x_data, y_data)]
    data_pair.sort(key=lambda x: x[1])

    (
        Pie(init_opts=opts.InitOpts(bg_color="#2c343c"))
        .add(
            series_name="访问来源",
            data_pair=data_pair,
            rosetype="radius",
            radius="55%",
            center=["50%", "50%"],
            label_opts=opts.LabelOpts(is_show=False, position="center"),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="Customized Pie",
                pos_left="center",
                pos_top="20",
                title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
        .set_series_opts(
            tooltip_opts=opts.TooltipOpts(
                trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
            ),
            label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
        )
        .render("output/"+df_hurun_pivot.index[i]+"_customized_pie.html")
    )


# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# In[ ]:





# * 利用 pivot 进行变形操作需要满足唯一性的要求，即由于在新表中的行列索引对应了唯一的 value ，因此原 表中的 index 和 columns 对应两个列的行组合必须唯一。例如，现在把原表中第二行张三的数学改为语文就 会报错，这是由于 Name 与 Subject 的组合中两次出现 (”San Zhang”, ”Chinese”) ，从而最后不能够确定到 底变形后应该是填写 80 分还是 75 分

# In[8]:


df = pd.DataFrame(
    {
        'Class':[1, 1, 2, 2, 1, 1, 2, 2],
        'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li','San Zhang', 'San Zhang', 'Si Li', 'Si Li'],
        'Examination': ['Mid', 'Final', 'Mid', 'Final','Mid', 'Final', 'Mid', 'Final'],
        'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese','Math', 'Math', 'Math', 'Math'],
        'Grade':[80, 75, 85, 65, 90, 85, 92, 88],
        'rank':[10, 15, 21, 15, 20, 7, 6, 2]
    })


# In[9]:


df


# ## 2. pivot 多级索引

# In[11]:


df.pivot(
    index = ['Class','Name'],
    columns = ['Subject','Examination'],
    values = ['Grade','rank'] 
        )


# In[18]:


hurun_独角兽 = pd.read_html('https://www.hurun.net/zh-CN/Info/Detail?num=L9SQPH9FKJB1')[-3]
hurun_独角兽[0:1].values.tolist()[0]
df_hurun = hurun_独角兽[1:]
df_hurun.columns = hurun_独角兽[0:1].values.tolist()[0]
df_hurun['价值（亿元人民币）'] = df_hurun['价值（亿元人民币）'].astype('int64')
df_hurun


# In[36]:


df_hurun.pivot_table(
    index = ['国家','城市'],
    columns = '行业',
    values = '价值（亿元人民币）',
    aggfunc="max"
        )


# In[22]:


df_hurun.query('国家 == "中国" or 国家 == "美国"').query()


# In[27]:


df_hurun.query('国家 == "中国"').行业.unique()


# In[28]:


df_hurun.query('国家 == "美国"').行业.unique()


# ## pivot_table
# * 增加聚合方法

# In[12]:


df = pd.DataFrame(
    {
        'Name':['San Zhang', 'San Zhang',  'San Zhang', 'San Zhang','Si Li', 'Si Li', 'Si Li', 'Si Li'],
        'Subject':['Chinese', 'Chinese', 'Math', 'Math','Chinese', 'Chinese', 'Math', 'Math'],
        'Grade':[80, 90, 100, 90, 70, 80, 85, 95]
    }
)


# In[13]:


df


# In[ ]:





# ## melt

# In[14]:


df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],'Chinese':[80, 90],'Math':[80, 75]})


# In[15]:


df


# In[16]:


df_melted = df.melt(id_vars = ['Class', 'Name'],
 value_vars = ['Chinese', 'Math'],
 var_name = 'Subject',
 value_name = 'Grade')


# In[17]:


df_melted


# In[ ]:




